#include "pvq_decoder.h"

#include "pvq.h"

#include <math.h>

int32_t get_eighth_bits_for_pvq_family(const pvq_family_t* pvq_family)
{
    float bits = 8 * log2(pvq_family_calculate_size(pvq_family));
    int bitsi = (int)floor(bits - 1e-6);

    return bitsi;
}

// for ascending values of N
static int32_t max_eighth_bits[] =
{
//  N = 0,   1,   2,   3,   4,   5,   6,   7,
       -1,   7,  71, 128, 179,  -1, 251,  -1,

//   N = 8,   9,  10,  11,  12,  13,  14,  15,
       255, 251,  -1, 250, 250,  -1,  -1,  -1,

//   N =16,  17,  18,  19,  20,  21,  22,  23
       253,  -1, 255,  -1,  -1,  -1, 246,  -1,

//   N =24... 31
       255,  -1,  -1,  -1,  -1,  -1,  -1,  -1,

//   N =32,  33,  34,  35,  36,  37,  38,  39
       237,  -1,  -1,  -1, 247,  -1,  -1,  -1,

//   N =40,  41,  42,  43,  44,  45,  46,  47
       -1,   -1,  -1,  -1, 234,  -1,  -1,  -1,

//   N =48... 55
       240,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,

//   N =64
       224,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
       231,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
       243,  -1,  -1,  -1,  -1,  -1,  -1,  -1,

//   N =96
       248,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,

//   N 144
       224,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,

//   N 176
       234,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
};

int32_t get_max_eighth_bits_for_vector(int32_t L)
{
    const int32_t numel = (sizeof(max_eighth_bits) / sizeof(max_eighth_bits[0]));
    if (L >= numel)
        return -1;

    return max_eighth_bits[L];
}
